#include <STC15F2K60S2.H>
#include "Key.h"
#include "init.h"
#include "Seg.h"
#include "Led.h"
#include "intrins.h"
#include "onewire.h"

#define uchar  unsigned char
#define uint   unsigned int
	
uchar  Key_down,Key_up,Key_value,Key_old;
uchar  Key_slow_down;
uchar  Seg_slow_down;
uchar  Seg_Buf[8]={10,10,10,10,10,10,10,10};
uchar  Seg_index;
uchar  Seg_point[8]={0,0,0,0,0,0,0,0};
uchar  Led_enable[8]={0,0,0,0,0,0,0,0};

uchar  Seg_mode;//界面切换  0-->温度界面  1-->校准值界面  2-->参数界面
float Tempture;//读取到的温度
int  TE_cent;//校准值参数
int  Cent=26;//参数值
bit mode;//触发方式 0-->上升触发  1-->下降触发
bit flag;//LED8的标志位


void Delay750ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 35;
	j = 51;
	k = 182;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void Key_Proc()
{
	if(Key_slow_down) Key_slow_down=0;
	Key_slow_down=1;
	
	Key_value=Key_Read();
	Key_down=Key_value &(Key_value ^Key_old);
	Key_up=~Key_value &(Key_value ^Key_old);
	Key_old=Key_value;
	
	if(Key_down==4)
	{
		if(++Seg_mode==3) Seg_mode=0;
	}
	if(Key_down==5)
	{
		mode ^=1;
	}
	if(Key_down==8)
	{
		if(Seg_mode==1)
		{
			if(--TE_cent==-99)
				TE_cent=-99;

		}
		if(Seg_mode==2)
		{
			if(--Cent==-99)
				Cent=-99;
		}
	}
	if(Key_down==9)
	{
		if(Seg_mode==1)
		{
			if(++TE_cent==99)
				TE_cent=99;

		}
		if(Seg_mode==2)
		{
			if(++Cent==99)
				Cent=99;
		}
	}
}

void Seg_Proc()
{
	uchar i;
	if(Seg_slow_down) Seg_slow_down=0;
	Seg_slow_down=1;
	
    switch(Seg_mode)
	{
		case 0://温度界面
			Tempture=rd_Tempture()+ TE_cent;
			Seg_Buf[0] =12;
			Seg_Buf[1]=Seg_Buf[2]=Seg_Buf[3]=Seg_Buf[4]=10;
			if(Tempture>=0)
			{
				Seg_Buf[5]=(uchar)Tempture / 10 %10;
				Seg_Buf[6]=(uchar)Tempture% 10;
				Seg_Buf[7]=(uint)(Tempture*10) %10;
				Seg_point[6]=1;
				i=5;
				while(Seg_Buf[i]==0)
				{
					Seg_Buf[i]=10;
					if(++i==7)
					{
						break;
					}
				}
			}
			else //温度小于零
			{   
				if(Tempture<-9)//温度为负两位数
				{
					Seg_Buf[4]=11;
					Seg_Buf[5]=(uchar)((-1)*Tempture)/10%10;
					Seg_Buf[6]=(uchar)((-1)*Tempture)%10;
					Seg_Buf[7]=(uint)((-1)*Tempture*10)%10;
					Seg_point[6]=1;
				}
				else//温度为负一位数
				{
					Seg_Buf[5]=11;
					Seg_Buf[6]=(uchar)((-1)*Tempture)/10 % 10;
					Seg_Buf[7]=(uint)((-1)*Tempture*10) %10;
					Seg_point[6]=1;
				}
			}
			break;
		case 1://校准值界面
			Seg_Buf[0] =13;
			Seg_Buf[1]=Seg_Buf[2]=Seg_Buf[3]=Seg_Buf[4]=10;
			Seg_point[6]=0;
			if(TE_cent>=0)
			{
				Seg_Buf[5]=TE_cent / 100 %10;
				Seg_Buf[6]=TE_cent /10% 10;
				Seg_Buf[7]=TE_cent %10;
				i=5;
				while(Seg_Buf[i]==0)
				{
					Seg_Buf[i]=10;
					if(++i==7)
					{
						break;
					}
				}	
			}
			else
			{
				if(TE_cent<-9)//双负值
				{
					Seg_Buf[5]=11;
					Seg_Buf[6]=(-1)*TE_cent /10% 10;
					Seg_Buf[7]=(-1)*TE_cent %10;
				}
				else//单负值
				{
					Seg_Buf[5]=10;
					Seg_Buf[6]=11;
					Seg_Buf[7]=(-1)*TE_cent %10;
				}
	
			}
			break;
		case 2://参数界面
			Seg_Buf[0] =14;
			Seg_point[6]=0;
			Seg_Buf[1]=Seg_Buf[2]=Seg_Buf[3]=Seg_Buf[4]=10;
			if(Cent>=0)
			{
					Seg_Buf[5]=Cent / 100 %10;
					Seg_Buf[6]=Cent/10% 10;
					Seg_Buf[7]=Cent %10;
					i=5;
					while(Seg_Buf[i]==0)
					{
						Seg_Buf[i]=10;
						if(++i==7)
						{
							break;
						}
					}
			}
			else
			{       
				    Cent *=-1;
				if(Cent>9)//双负值
				{
					Seg_Buf[5]=11;
					Seg_Buf[6]=Cent/10% 10;
					Seg_Buf[7]=Cent %10;
					
				}
				else //单负值
				{
					Seg_Buf[5]=10;
					Seg_Buf[6]=11;
					Seg_Buf[7]=Cent %10;
				}

			}
		break;
	}
	
	
	
}

void LED_Proc()
{
	uchar i;
	for(i=0;i<3;i++)
	{
		Led_enable[i]=(i==Seg_mode);
	}
	for(i=3;i<5;i++)
	{
		Led_enable[i]=(i-3==mode);
	}
	if(mode)
	{
		flag=(Tempture<Cent)?1:0;
	}
	else
		flag=(Tempture>Cent)?1:0;
	Led_enable[7]=flag;
}


void Timer1Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x18;		//设置定时初值
	TH1 = 0xFC;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	ET1=1;
	EA=1;
}

void Timer1serve() interrupt 3
{
	if(++Key_slow_down==10)  Key_slow_down=0;
	if(++Seg_slow_down==200) Seg_slow_down=0;
	if(++Seg_index==8)  Seg_index=0;
	Seg_disp(Seg_index,Seg_Buf[Seg_index],Seg_point[Seg_index]);
	Led_show(Seg_index,Led_enable[Seg_index]);	
}

void main()
{
	System_Init();
	rd_Tempture();//先空读取，避免出现默认值
	Delay750ms();
	Timer1Init();
   while(1)
   {
	   Key_Proc();
	   Seg_Proc();
	   LED_Proc();
   }
	
}